Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C] errore nan> not a number
Forum - C/C++ - [C] errore nan> not a number

Avatar
fa1212 (Normal User)
Pro


Messaggi: 101
Iscritto: 09/10/2008

Segnala al moderatore
Postato alle 21:14
Sabato, 23/01/2010
Salve a tutti,

ho creato codesto codice:
Codice sorgente - presumibilmente C#

  1. /*
  2.   Name: Geometria Analitica di base
  3.   Copyright: Fallen Angel
  4.   Author: Fallen Angel
  5.   Date: 22/01/10 21.23
  6.   Description: Calcolo delle funzioni della geometria analitica di base
  7.   Distanza tra due punti, punto medio, baricentro.  
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <math.h>
  12. main() {
  13. int px1,px2,px3,py1,py2,py3;
  14. int MxAB,MyAB,MxBC,MyBC,MxCA,MyCA;
  15. int Gx,Gy;
  16. double distanzaAB,distanzaBC,distanzaCA,perimetro;
  17. char S;
  18. /*da px1 a px3 coordinate dell'asse delle ordinate dei punti
  19. da py1 a py3 coordinate dell'asse delle scisse dei punti
  20. Mx-My punto medio, Gx-Gy baricentro, distanzaAB distanza tra due punti*/
  21.  
  22. do {
  23.     printf("\n------------------------------------------------------------------");
  24.     printf("\n| Geometria analitica di base:                                   |");
  25.     printf("\n------------------------------------------------------------------");
  26.     printf("\n\n- Inserire le coordinate dell'ordinata del punto A: ");
  27.     scanf ("%i",&px1);
  28.     printf("- Inserire le coordinate dell'ascissa del punto A: ");
  29.     scanf ("%i",&py1);
  30.     printf("- Inserire le coordinate dell'ordinata del punto B: ");
  31.     scanf ("%i",&px2);
  32.     printf("- Inserire le coordinate dell'ascissa del punto B: ");
  33.     scanf ("%i",&py2);
  34.     printf("- Inserire le coordinate dell'ordinata del punto C: ");
  35.     scanf ("%i",&px3);
  36.     printf("- Inserire le coordinate dell'ascissa del punto C: ");
  37.     scanf ("%i",&py3);
  38.     distanzaAB=sqrt((px1-px2)^2+(py1-py2)^2);
  39.     distanzaBC=sqrt((px2-px3)^2+(py2-py3)^2);
  40.     distanzaCA=sqrt((px3-px1)^2+(py3-py1)^2);
  41.     perimetro=(distanzaAB+distanzaBC+distanzaCA);
  42.     MxAB=(px1+px2)/2;
  43.     MyAB=(py1+py2)/2;
  44.     MxBC=(px2+px3)/2;
  45.     MyBC=(py2+py3)/2;
  46.     MxCA=(px3+px1)/2;
  47.     MyCA=(py3+py1)/2;
  48.     Gx=(px1+px2+px3)/3;
  49.     Gy=(py1+py2+py3)/3;
  50.     printf("------------------------------------------------------------------");
  51.     printf("\n> Risultati:                                                      ");
  52.     printf("\n> Distanza tra il punto A e il punto B = %lf",distanzaAB);
  53.     printf("\n> Distanza tra il punto B e il punto C = %lf",distanzaBC);
  54.     printf("\n> Distanza tra il punto C e il punto A = %lf",distanzaCA);
  55.     printf("\n> Perimetro = %lf",perimetro);
  56.     printf("\n> Coordinate del punto medio tra AB (xM;yM) = %f;%f",MxAB,MyAB);
  57.     printf("\n> Coordinate del punto medio tra BC (xM;yM) = %f;%f",MxBC,MyBC);
  58.     printf("\n> Coordinate del punto medio tra CA (xM;yM) = %f;%f",MxCA,MyCA);
  59.     printf("\n> Coordinate del baricentro (xG;yG) = %f;%f",Gx,Gy);
  60.     printf("\n------------------------------------------------------------------");
  61.     printf("\n\n+ Vuoi rieseguire il programma? (Y/N) ");
  62.     fflush(stdin);//pulisce il buffer dall'ultimo carattere (INVIO)
  63.     scanf("%c",&S);
  64. }while ((S=='y') || (S=='Y'));
  65. return 0;
  66. }



Il probelma è che quando esegue i calcoli risultano tutti nan, dove ho sbagliato??

Mi sà che ho fatto una boiata ma non trovo l'errore XD.

Grazie mille per le risposte in anticipo!

PM Quote
Avatar
delta (Normal User)
Pro


Messaggi: 96
Iscritto: 01/09/2009

Segnala al moderatore
Postato alle 21:27
Sabato, 23/01/2010
come fa ad uscirti NAN? ora non posso provarlo, ma mi sembra strano...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:34
Sabato, 23/01/2010
Ciao!

Ho letto il codice, e ho trovato alcune piccole imperfezioni:
- Quando fai delle divisioni, accertati di usere variabili non intere.
- La funzione che calcola la potrnza è pow( <base>, <esponente> ).
  Non (px1-px2)^2, l' operatore ^ è l' or bit a bit.

Ecco il codice corretto:
Codice sorgente - presumibilmente C#

  1. /*
  2.   Name: Geometria Analitica di base
  3.   Copyright: Fallen Angel
  4.   Author: Fallen Angel
  5.   Date: 22/01/10 21.23
  6.   Description: Calcolo delle funzioni della geometria analitica di base
  7.   Distanza tra due punti, punto medio, baricentro.  
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <math.h>
  12. main() {
  13. int px1,px2,px3,py1,py2,py3;
  14. double MxAB,MyAB,MxBC,MyBC,MxCA,MyCA;
  15. double Gx,Gy;
  16. double distanzaAB,distanzaBC,distanzaCA,perimetro;
  17. char S;
  18. /*da px1 a px3 coordinate dell'asse delle ordinate dei punti
  19. da py1 a py3 coordinate dell'asse delle scisse dei punti
  20. Mx-My punto medio, Gx-Gy baricentro, distanzaAB distanza tra due punti*/
  21.  
  22. do {
  23.     printf("\n------------------------------------------------------------------");
  24.     printf("\n| Geometria analitica di base:                                   |");
  25.     printf("\n------------------------------------------------------------------");
  26.     printf("\n\n- Inserire le coordinate dell'ordinata del punto A: ");
  27.     scanf ("%i",&px1);
  28.     printf("- Inserire le coordinate dell'ascissa del punto A: ");
  29.     scanf ("%i",&py1);
  30.     printf("- Inserire le coordinate dell'ordinata del punto B: ");
  31.     scanf ("%i",&px2);
  32.     printf("- Inserire le coordinate dell'ascissa del punto B: ");
  33.     scanf ("%i",&py2);
  34.     printf("- Inserire le coordinate dell'ordinata del punto C: ");
  35.     scanf ("%i",&px3);
  36.     printf("- Inserire le coordinate dell'ascissa del punto C: ");
  37.     scanf ("%i",&py3);
  38.          distanzaAB=sqrt(pow((px1-px2), 2.0)+pow((py1-py2), 2.0));
  39.          distanzaBC=sqrt(pow((px2-px3), 2.0)+pow((py2-py3), 2.0));
  40.     distanzaCA=sqrt(pow((px3-px1), 2.0)+pow((py3-py1), 2.0));
  41.     perimetro=(distanzaAB+distanzaBC+distanzaCA);
  42.          MxAB=(px1+px2)/2.0;
  43.          MyAB=(py1+py2)/2.0;
  44.          MxBC=(px2+px3)/2.0;
  45.          MyBC=(py2+py3)/2.0;
  46.          MxCA=(px3+px1)/2.0;
  47.          MyCA=(py3+py1)/2.0;
  48.          Gx=(px1+px2+px3)/3.0;
  49.     Gy=(py1+py2+py3)/3.0;
  50.     printf("------------------------------------------------------------------");
  51.     printf("\n> Risultati:                                                      ");
  52.     printf("\n> Distanza tra il punto A e il punto B = %lf",distanzaAB);
  53.     printf("\n> Distanza tra il punto B e il punto C = %lf",distanzaBC);
  54.     printf("\n> Distanza tra il punto C e il punto A = %lf",distanzaCA);
  55.     printf("\n> Perimetro = %lf",perimetro);
  56.     printf("\n> Coordinate del punto medio tra AB (xM;yM) = %f;%f",MxAB,MyAB);
  57.     printf("\n> Coordinate del punto medio tra BC (xM;yM) = %f;%f",MxBC,MyBC);
  58.     printf("\n> Coordinate del punto medio tra CA (xM;yM) = %f;%f",MxCA,MyCA);
  59.     printf("\n> Coordinate del baricentro (xG;yG) = %f;%f",Gx,Gy);
  60.     printf("\n------------------------------------------------------------------");
  61.     printf("\n\n+ Vuoi rieseguire il programma? (Y/N) ");
  62.     fflush(stdin);//pulisce il buffer dall'ultimo carattere (INVIO)
  63.     scanf("%c",&S);
  64. }while ((S=='y') || (S=='Y'));
  65. return 0;
  66. }


Ultima modifica effettuata da Poggi Marco il 23/01/2010 alle 21:37
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:16
Domenica, 24/01/2010
I NaN ti venivano fuori perchè visualizzavi con la printf e lo switch %f dei valori interi.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 10:50
Domenica, 24/01/2010
Probabilmente sì, non ho analizzato bene il problema.
Un altro errore possibile è che l' istruzione
Codice sorgente - presumibilmente Plain Text

  1. distanzaAB=sqrt((px1-px2)^2+(py1-py2)^2);


vada a calcolare la radice di un numero negativo.

Ultima modifica effettuata da Poggi Marco il 24/01/2010 alle 10:52
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6405
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:11
Domenica, 24/01/2010
No ... se l'argomento è negativo, l'errore è un altro ... semmai, potrebbe essere che l'argomento della sqrt sia stato modificato (con quell'operatore a bit) in modo che il formato double sia sballato ...

Ma un compilatore decente dovrebbe fare un po' di bizze su quella scrittura ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 12:13
Domenica, 24/01/2010
Testo quotato

Postato originariamente da Poggi Marco:

Ciao!

Ho letto il codice, e ho trovato alcune piccole imperfezioni:
- Quando fai delle divisioni, accertati di usere variabili non intere.
- La funzione che calcola la potrnza è pow( <base>, <esponente> ).
  Non (px1-px2)^2, l' operatore ^ è l' or bit a bit.



Come già evidenziato da Poggi Marco i problemi sono esattamente quei due, però ci tenevo a precisare che l'operatore ^ (accento circonflesso) è utilizzato per operazioni sui bit esattamente per l' OR esclusivo ovvero lo XOR.
Quindi con l'operazione (espressione)^(esponente) che nel nostro caso è (px1-px2)^2 , effettuava uno XOR tra il numero risultante dalla differenza di px1 e px2 e il numero 2.
Per esempio se px1-px2 valeva 5 il risultato sarebbe stato:

(5 in bin)  ( 2 in bin)     (5 XOR 2)
    
    1            0              1
    0            1              1
    1            0              1

cioè 5 XOR 2 sarebbe stato uguale a 7
quindi il risultato di (px1-px2)^2 non è l'esponenziale bensì un'operazione tra bit, e così il risultato era falsato(ovviamente il compilatore non è colpevole di tutto ciò dato che la sintassi risulta corretta).
La funzione esponenziale offerta dal C è pow(base,esponente).
Per la distanza tra i punti non c'è bisogno di verificare se il numero passato alla funzione sqrt() sia positivo, visto che nell'espressione compaiono due funzioni con esponente pari e quindi il risultato è sicuramente sempre positivo.

Ultima modifica effettuata da Zonzo il 24/01/2010 alle 12:21
PM Quote
Avatar
fa1212 (Normal User)
Pro


Messaggi: 101
Iscritto: 09/10/2008

Segnala al moderatore
Postato alle 15:25
Lunedì, 25/01/2010
Grazie mille.

Era da un po' che non usavo più il C e qunado ho copiato la formula dal libro non mi è venuto più in mente che in C l'accento circonflesso è un operatore. Lol che nabbo...

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:26
Lunedì, 25/01/2010
Di nulla!

PM Quote